package app.core.admin;

import app.web.admin.domain.pojo.Admin;
import app.web.admin.mapper.AdminMenuMapper;
import app.web.admin.mapper.AdminRoleMapper;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaFoxUtil;
import com.gitee.feizns.dynamic.Lists;
import com.mybatisflex.core.query.QueryChain;
import com.mybatisflex.core.util.LambdaGetter;

import java.util.List;

/**
 * 管理员
 * @author feizns
 * @since 2025/9/28
 */
public class Admins {

    /**
     * 是否是登录
     * @return boolean
     */
    public static boolean isLogin() {
        return StpUtil.isLogin();
    }

    /**
     * 登录编号
     * @return {@link Long }
     */
    public static Long currentId() {
        return StpUtil.getLoginIdAsLong();
    }

    /**
     * 查询指定管理员的指定列
     * @return {@link Admin }
     */
    @SafeVarargs
    public static Admin of(Long id, LambdaGetter<Admin>... column) {
        return QueryChain.of(Admin.class).eq(Admin::getId, id).select(column).one();
    }

    /**
     * 查询当前管理员的指定列
     * @return {@link Admin }
     */
    @SafeVarargs
    public static Admin current(LambdaGetter<Admin>... column) {
        return of(currentId(), column);
    }

    /**
     * 查询指定用户的角色编号列表
     * @return {@link List }<{@link Long }>
     */
    public static List<Long> roleIds(Long id) {
        return of(id, Admin::getRoleIds).getRoleIds();
    }

    /**
     * 查询指定用户的角色编号列表
     * @return {@link List }<{@link Long }>
     */
    public static List<Long> roleIds() {
        return current(Admin::getRoleIds).getRoleIds();
    }

    /**
     * 菜单编号列表
     * @return {@link List }<{@link Long }>
     */
    public static List<Long> menuIds() {
        return AdminRoleMapper.findMenuIdsByIds(roleIds());
    }

    /**
     * 当前用户的菜单标识符列表
     * @return {@link List }<{@link String }>
     */
    public static List<String> menuIdentifiers() {
        return AdminMenuMapper.identifiersByIds(Lists.of(currentId()));
    }

    /**
     * 指定用户的菜单标识符列表
     * @return {@link List }<{@link String }>
     */
    public static List<String> menuIdentifiers(Long userid) {
        return AdminMenuMapper.identifiersByIds(Lists.of(userid));
    }

    /**
     * 模糊匹配
     * @param patterns 模式
     * @param identifier 标识符
     * @return boolean
     */
    public static boolean vagueAnyMatch(List<String> patterns, String identifier) {
        return patterns.stream().anyMatch(pattern -> SaFoxUtil.vagueMatch(pattern, identifier));
    }

    /**
     * 令牌会话
     * @return {@link SaSession }
     */
    public static SaSession tokenSession() {
        return StpUtil.getTokenSession();
    }

}
